package common;

import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class TestForXmlReader {

	DocumentBuilderFactory dbf = null;
	DocumentBuilder db = null;
	Document doc = null;

	NodeList nodeLst = null;
	Node node = null;
	Element element = null;
	static final int isRoot = 0;
	static final int isNotRoot = 1;
	
	HashMap<String, String> hm = null;
	ArrayList<HashMap<String, String>> al = null;

	/**
	 * 생성자
	 */
	public TestForXmlReader(String uri) {

		try {
			dbf = DocumentBuilderFactory.newInstance();
			db = dbf.newDocumentBuilder();
			doc = db.parse(uri);
			doc.getDocumentElement().normalize();

		} catch (Exception e) {
			System.out.println("e :" + e);
		}
	}

	/**
	 * 해당 tagName의 NodeList를 반환한다.
	 * 
	 * @param tagName
	 * @param rootOrNot
	 *            0 이면 NodeList를 root에서 찾고 아니면 element에서 찾는다.
	 * @return
	 */
	public NodeList getNodeList(String tagName, int rootOrNot) {

		if (rootOrNot == 0 || element == null) {
			nodeLst = doc.getElementsByTagName(tagName);
		} else {
			nodeLst = element.getElementsByTagName(tagName);
		}
		return nodeLst;
	}

	/**
	 * obj에서 tagName의 NodeList를 반환한다.
	 * 
	 * @param obj
	 * @param tagName
	 * @param rootOrNot
	 *            rootOrNot 0이면 NodeList를 root에서 찾고 아니면 element에서 찾는다.
	 * @return
	 */
	public NodeList getNodeList(Object obj, String tagName, int rootOrNot) {

		if (obj instanceof Document) {
			return ((Document) obj).getElementsByTagName(tagName);
		} else if (obj instanceof Element) {
			return ((Element) obj).getElementsByTagName(tagName);
		}
		return null;
	}

	/**
	 * nodeLst에서 element를 반환한다.
	 * 
	 * @param index
	 * @return
	 */
	public Element getElement(int index) {
		return element = (Element) nodeLst.item(index);
	}

	/**
	 * nodeList에서 element를 반환한다.
	 * 
	 * @param nodeList
	 * @param index
	 * @return
	 */
	public Element getElement(NodeList nodeList, int index) {
		return element = (Element) nodeList.item(index);
	}

	/**
	 * element 에서 tagName의 value를 반환한다.
	 * 
	 * @param tagName
	 * @return String tagvalue
	 */
	public String getTagValue(String tagName) {
		return ((Node) ((Element) element.getElementsByTagName(tagName).item(0))
				.getChildNodes().item(0)).getNodeValue();
	}

	/**
	 * emt 에서 tagName의 value를 반환한다.
	 * 
	 * @param emt
	 * @param tagName
	 * @return String tagvalue
	 */
	public String getTagValue(Element emt, String tagName) {
		return ((Node) ((Element) emt.getElementsByTagName(tagName).item(0))
				.getChildNodes().item(0)).getNodeValue();
	}

	/**
	 * nodeList 에서 tagName의 value를 반환한다.
	 * 
	 * @param nodeList
	 * @param tagName
	 * @return String tagvalue
	 */
	public String getTagValue(NodeList nodeList, String tagName) {
		return ((Node) ((Element) ((Element) nodeList.item(0))
				.getElementsByTagName(tagName).item(0)).getChildNodes().item(0))
				.getNodeValue();
	}

	/**
	 * nodeList에서 tagName에 설정되어있는 속성(key)의 값을 반환한다.
	 * 
	 * @param nodeList
	 * @param tagName
	 * @param key
	 * @return attribute Value
	 */
	public String getAttribute(NodeList nodeList, String tagName, String key) {
		return ((Element) ((Element) nodeList.item(0)).getElementsByTagName(
				tagName).item(0)).getAttribute(key);
	}
	
	/**
	 * XML을 ArrayList로 반환해준다
	 */
	
	public ArrayList<HashMap<String, String>> XmlToArrayList() {
		al = new ArrayList<HashMap<String, String>>();
		Element list = doc.getDocumentElement();
		NodeList nodelist = list.getElementsByTagName("row");
		
		for (int i = 0; i < nodelist.getLength(); i++) {
			hm = new HashMap<String, String>();
			Element element = (Element) nodelist.item(i);
			int length = element.getChildNodes().getLength();

			for (int j = 0; j < length; j++) {
				hm.put(element.getChildNodes().item(j).getNodeName(), element.getChildNodes().item(j).getTextContent());
			}
			al.add(hm);
		}
		return al;
	}
	//
	// Set, Get Method
	//
	public static int getIsNotRoot() {
		return isNotRoot;
	}

	public static int getIsRoot() {
		return isRoot;
	}

	public DocumentBuilder getDb() {
		return db;
	}

	public void setDb(DocumentBuilder db) {
		this.db = db;
	}

	public DocumentBuilderFactory getDbf() {
		return dbf;
	}

	public void setDbf(DocumentBuilderFactory dbf) {
		this.dbf = dbf;
	}

	public Document getDoc() {
		return doc;
	}

	public void setDoc(Document doc) {
		this.doc = doc;
	}

	public Element getElement() {
		return element;
	}

	public void setElement(Element element) {
		this.element = element;
	}

	public Node getNode() {
		return node;
	}

	public void setNode(Node node) {
		this.node = node;
	}

	public NodeList getNodeLst() {
		return nodeLst;
	}

	public void setNodeLst(NodeList nodeLst) {
		this.nodeLst = nodeLst;
	}

}